<html>
<head><meta charset="utf-8"><title>Edition policy · project leads (public) · Zulip Chat Archive</title></head>
<h2>Stream: <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/index.html">project leads (public)</a></h2>
<h3>Topic: <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html">Edition policy</a></h3>

<hr>

<base href="https://rust-lang.zulipchat.com">

<head><link href="https://rust-lang.github.io/zulip_archive/style.css" rel="stylesheet"></head>

<a name="203513614"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/203513614" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#203513614">(Jul 10 2020 at 14:34)</a>:</h4>
<p>Hey folks -- <span class="user-mention" data-user-id="116011">@Steve Klabnik</span> and I were working on a draft RFC regarding Rust 2021 and future editions. <a href="https://hackmd.io/jJflujmLS_-sFPUkYo417g?view">The text is available in this hackmd</a>, feel free to leave comments. The gist of it is as follows:</p>
<p>The plan for editions was laid out in [RFC 2052] and Rust had its first edition in 2018. This effort was in many ways a success but also resulted in some difficult lessons. As part of this year's roadmap, one of the major questions we identified was that we need to decide whether we are going to do more editions and -- if so -- how we are going to manage the process.</p>
<p>[RFC 2052]: <a href="https://github.com/rust-lang/rfcs/blob/master/text/2052-epochs.md">https://github.com/rust-lang/rfcs/blob/master/text/2052-epochs.md</a></p>
<p>This RFC proposes a specific answer to those questions:</p>
<ul>
<li>We will do new Rust editions on a regular, three-year cadence.<br>
    * We will roll out an edition regardless of whether there are breaking changes.</li>
<li>Unlike Rust 2018, we will avoid using editions as a "deadline" to tie together high-priority projects.<br>
    * Instead, we embrace the train model, but editions are effectively a "somewhat bigger release", giving us an opportunity to give an overview of all the work that has landed over the previous three years.</li>
<li>We specify a cadence for Edition lints.<br>
    * "Edition idiom" lints for Edition N will warn for editions before N, and become "deny by default" in Edition N.<br>
    * Since it would be disruptive to introduce deny-by-default lints for Rust 2018 now, the Rust 2018 lints are repurposed into Rust 2021 Edition lints.</li>
<li>We specify a policy on reserving keywords and other prospective changes.<br>
    * In short, reserving keywords is allowed only as part of an active project group.</li>
</ul>



<a name="203555229"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/203555229" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> BatmanAoD (Kyle Strand) <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#203555229">(Jul 10 2020 at 20:37)</a>:</h4>
<p>Interesting. Was there any thought to extending the "train" schedule period to four (or even five) years instead of three? New features are not generally blocked on edition releases, and I haven't gotten the feeling that a hypothetical 2021 edition will be particularly notable. So I wonder if setting in stone a three-year cadence might be overly aggressive for no reason.</p>



<a name="203558856"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/203558856" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Lokathor <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#203558856">(Jul 10 2020 at 21:17)</a>:</h4>
<p>15 to 18 is 3, and people would hate it forever, and i mean quite literally <strong>forever</strong>, if one edition time frame was 3 and all the rest were some not-3 value.</p>



<a name="203558943"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/203558943" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Manish Goregaokar <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#203558943">(Jul 10 2020 at 21:18)</a>:</h4>
<p>The general idea was that EITHER:</p>
<ul>
<li>editions are something with a predictable schedule. if something misses an edition, it can make the next one</li>
<li>editions happen when sufficient things pile up and are on their own schedule and unpredictable</li>
</ul>
<p>we went with the former. it's fine if the editions aren't notable, we would actually prefer for the editions to not be super notable, 2018 ended up being a lot of work to do at once</p>



<a name="203559007"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/203559007" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Lokathor <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#203559007">(Jul 10 2020 at 21:19)</a>:</h4>
<p>2021 actually has at least one breaking change lined up for it so far, and even one such change is enough when part of the point is also to keep to a schedule so as to keep the process smooth.</p>



<a name="203559118"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/203559118" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Lokathor <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#203559118">(Jul 10 2020 at 21:20)</a>:</h4>
<p>(rather, it's <em>proposed</em> for 2021 but not fully ratified, etc etc)</p>



<a name="203559234"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/203559234" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> simulacrum <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#203559234">(Jul 10 2020 at 21:22)</a>:</h4>
<p>IMO 5 years feels a bit on the long side, 3 years feels like a good cadence -- sort of exploration/development/polish type cycling</p>



<a name="203559951"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/203559951" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Lokathor <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#203559951">(Jul 10 2020 at 21:31)</a>:</h4>
<p>possible prior art: Haskell also lets you specify the spec you target (but no practical project follows those specs since everyone uses extensions all the time)</p>



<a name="203580820"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/203580820" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Josh Triplett <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#203580820">(Jul 11 2020 at 04:52)</a>:</h4>
<p><span class="user-mention" data-user-id="224471">@Lokathor</span> I've seen mention of a couple of potential changes; which one did you have in mind that's breaking?</p>



<a name="203580834"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/203580834" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Lokathor <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#203580834">(Jul 11 2020 at 04:54)</a>:</h4>
<p>Ah, there I was thinking of the "unsafe calls require unsafe blocks even within unsafe fn" going from allow by default to deny by default.</p>



<a name="203580879"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/203580879" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Josh Triplett <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#203580879">(Jul 11 2020 at 04:55)</a>:</h4>
<p>Ah, that.</p>



<a name="203580884"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/203580884" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Josh Triplett <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#203580884">(Jul 11 2020 at 04:55)</a>:</h4>
<p>I think we haven't <em>completely</em> committed to that changing in the 2021 edition; it seems likely, but we need to see how the warning does in the ecosystem first, I think.</p>



<a name="203580928"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/203580928" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Josh Triplett <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#203580928">(Jul 11 2020 at 04:56)</a>:</h4>
<p>And we've seen a couple of cases where it introduce a lot of <code>unsafe fn foo() { unsafe {</code>, so it may be important to think about those ergonomics and that phrasing.</p>



<a name="203581004"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/203581004" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Lokathor <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#203581004">(Jul 11 2020 at 04:59)</a>:</h4>
<p>As long as it's deny by default and never ever an unchangeable hard error it's fine</p>



<a name="203581007"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/203581007" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Lokathor <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#203581007">(Jul 11 2020 at 04:59)</a>:</h4>
<p>people can simply put an allow on their module</p>



<a name="203581074"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/203581074" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Lokathor <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#203581074">(Jul 11 2020 at 05:01)</a>:</h4>
<p>And speaking as a person who mostly writes libraries full of hundreds of unsafe functions and unsafe calls, it's a good thing for people to <em>by default</em> have an extra guard rail on.</p>



<a name="203584173"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/203584173" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> XAMPPRocky <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#203584173">(Jul 11 2020 at 06:53)</a>:</h4>
<p>Reading at the draft wouldn't the "unsafe in unsafe" be an "idiom lint" and thus be warn by default in 2021 not deny by default?</p>



<a name="204134590"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/204134590" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#204134590">(Jul 16 2020 at 19:54)</a>:</h4>
<p>There are several proposed "migrations"</p>



<a name="204134610"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/204134610" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#204134610">(Jul 16 2020 at 19:54)</a>:</h4>
<p>the one I keep bringing up as an example is <a href="https://github.com/rust-lang/rfcs/issues/2229">rfc#2229</a></p>



<a name="204134655"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/204134655" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#204134655">(Jul 16 2020 at 19:55)</a>:</h4>
<p>another I just saw is a proposed change to the semantics of <code>panic!("{var}")</code>, so that it would mean <code>panic!("{}", var)</code>, essentially</p>



<a name="204134692"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/204134692" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#204134692">(Jul 16 2020 at 19:55)</a>:</h4>
<p>there were more, too, but I forget =) I think one of the things we also talked about was reserving space for keyword arguments, but I'd be reluctant to do that (per this RFC) without active work going on in that space</p>



<a name="204134794"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/204134794" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#204134794">(Jul 16 2020 at 19:56)</a>:</h4>
<p>it's hard to know the "perfect" duration for editions though indeed the hope is that they will be small and regular</p>



<a name="204138249"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/204138249" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> BatmanAoD (Kyle Strand) <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#204138249">(Jul 16 2020 at 20:27)</a>:</h4>
<p>what do you mean by "reserving space" here?</p>



<a name="204206652"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/204206652" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#204206652">(Jul 17 2020 at 13:39)</a>:</h4>
<p>I updated the RFC appendix with those two examples</p>



<a name="204206721"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/204206721" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#204206721">(Jul 17 2020 at 13:40)</a>:</h4>
<p><span class="user-mention silent" data-user-id="120076">BatmanAoD (Kyle Strand)</span> <a href="#narrow/stream/217588-project-leads.20(public)/topic/Edition.20policy/near/204138249">said</a>:</p>
<blockquote>
<p>what do you mean by "reserving space" here?</p>
</blockquote>
<p>I meant basically making things like <code>foo(a=a)</code> become an error so that at some point the syntax can be repurposed for named arguments</p>



<a name="204207351"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/204207351" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> Lokathor <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#204207351">(Jul 17 2020 at 13:46)</a>:</h4>
<p>just make it <code>foo(a:a)</code> instead</p>



<a name="204210082"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/204210082" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#204210082">(Jul 17 2020 at 14:09)</a>:</h4>
<p>that is also valid syntax today</p>



<a name="204210086"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/204210086" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#204210086">(Jul 17 2020 at 14:09)</a>:</h4>
<p>(type ascription)</p>



<a name="204210090"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/204210090" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#204210090">(Jul 17 2020 at 14:09)</a>:</h4>
<p>(unstable, though)</p>



<a name="204210223"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/204210223" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#204210223">(Jul 17 2020 at 14:10)</a>:</h4>
<p>but anyway the point is that the RFC, as written, prevents us from "reserving syntactic space" without a real plan. It would instead say that we should have an accepted RFC with the syntax we want and a plan to implement it -- and then we can make it an error as a first step in the next edition.</p>



<a name="204210248"></a>
<h4><a href="https://rust-lang.zulipchat.com#narrow/stream/217588-project%20leads%20%28public%29/topic/Edition%20policy/near/204210248" class="zl"><img src="https://rust-lang.github.io/zulip_archive/assets/img/zulip.svg" alt="view this post on Zulip" style="width:20px;height:20px;"></a> nikomatsakis <a href="https://rust-lang.github.io/zulip_archive/stream/217588-project-leads-(public)/topic/Edition.20policy.html#204210248">(Jul 17 2020 at 14:10)</a>:</h4>
<p>This works best if editions come out "regularly"</p>



<hr><p>Last updated: Aug 07 2021 at 22:04 UTC</p>
</html>